<?php

require_once "Basic.php";

class MakeAllocation extends BasicEntity {
  
  public function __construct($idReserva) {
    if(gettype($idReserva) !== "integer") {
      throw new Exception("idReserva não é integer.");
    }
    
    $this->idReserva = $idReserva;
    try {
      $db = new DBUtils();
      $db->connect();
      $db->runQuery("select * from TodasReservas where idReserva = ?", array($idReserva));
      $item = $db->getItem();
      if($item === null) {
        $this->fields = array();
        $idReserva = null;
        return;
      }
      $allVehicles = Veiculo::getAllForReservationForChoice($idReserva);
      $this->fields = array (
        new FormField(true, "veiculo", htmlentities("Selecione a placa de Veículo"), new FormFieldChoice($allVehicles)),
        new FormField(true, "condutor", htmlentities("Email do Condutor"), new FormFieldEmail())
      );
      $this->processFields();
    }
    catch(DBError $e) {
      logMessage($e->errors, "MakeAllocation");
      $this->fields = array();
    }
  }
  
  public function actionDescription() {
    return "MakeAllocation";
  }
  
  public function actionMakeAllocation() {
    foreach($this->fields as $k => $v) {
      $$k = $v->value();
    }
    
    $veiculo = intval($veiculo);
    $now = new DateTime("now");
    $client = Cliente::getFromEmail($condutor);
    
    if($client === null || $client->tipoPF !== "condutor") {
      return "Email não corresponde a nenhum condutor.";
    }
    
    $db = new DBUtils();
    try {
      $db->connect();
      $db->runQuery("select * from FrotaDisponivelReserva(?) where idVeiculo = ?", array($this->idReserva, $veiculo));
      $item = $db->getItem();
      if($item === null) {
        $db->close();
        return htmlentities("Veículo não disponível.");
      }
      $insertQuery = <<<SQL
insert into Locacao (dataObtencao, kilometragemObtencao, veiculo, efetivacao, condutor) values (?, ?, ?, ?, ?)
SQL;
      $insertArgs = array($now, $item->kmAtual, $veiculo, $this->idReserva, $client->idCliente);
      $db->runQuery($insertQuery, $insertArgs);
      $db->close();
    }
    catch(DBError $e) {
      logMessage($e->errors, "MakeAllocation");
      $db->close();
      return "Falha no banco de dados. O erro foi reportado.";
    }
    
    return true;
  }
  
  public function valid() {
    return $idReserva !== null && count($this->fields) > 0;
  }
}

mustBeEmployee();
correctStdFormGET();

mustBe(isset($_GET["idReserva"]));
$idReserva = intval($_GET["idReserva"]);

$page = new Page(htmlentities("Fazer uma Locação"));
$req = new MakeAllocation($idReserva);
$form = new StdForm($req, $_GET, $_POST,
                    "<p>Selecione a placa do carro que se quer alugar.</p>",
                    "<p>" . htmlentities("Locação realizada com sucesso.") . "</p>",
                    "MakeAllocation.php?idReserva=${idReserva}");
$form->processForm();
$page->addContent($form->getHtml());

echo $page->getHtml();

